#pragma once
#include <vector>

#include "Utility/Algebra/Graph.h"

#include "DataStructure/Common/Id.h"
#include "DataStructure/Common/SGNamespace.h"

#include "DBManager/DBServiceFactory.h"

#include "SGFem/Pre/Common/PreExport.h"

SG_NAMESPACE_OPEN
namespace FEMSolver
{
    /** @brief 最小度排序算法
     *
     * 最小度排序算法， Cholesky分解最小填入元数量
     */
    class Pre_DECLSPEC MinimumDegreeSort
    {
      public:
        MinimumDegreeSort ();
        /// 使得节点编号升序排列
        static void SortNodeId (std::vector<SG::DataStructure::Common::Id>& nodeIds, std::vector<std::size_t>& indexes);

        /// 生成网格拓扑对应的图
        /// 前置条件：nodeIds需要升序排列
        static Algebra::Graph GenerateGraph (const SG::DBManager::DBServiceFactorySP        dbServiceFactory,
                                                             const std::vector<SG::DataStructure::Common::Id>& nodeIds,
                                                             const std::vector<std::size_t>&                indexes);

        /** @brief 创建新的节点排序， 新id和数据库中索引位置建立联系
         *
         * 生成具有最小填入元的节点排序。
         *
         * @param [out] 新的节点排序索引
         */
        static void Compute (const SG::DBManager::DBServiceFactorySP  dbServiceFactory,
                             std::vector<SG::DataStructure::Common::Id>& nodeIds,
                             std::vector<std::size_t>&                indexes);

      private:
    };
};  // namespace FEMSolver

SG_NAMESPACE_CLOSE